package com.study.design.pattern.pattern.behavioral.templatemethod;

/**
 * @Author: gongsl
 * @Date: 2025-03-20 22:55
 * @description: 数据导出抽象类
 */
public abstract class DataExporter {

    /**
     * 模板方法，定义导出数据的完整流程
     */
    public final void export() {
        // 查询数据
        fetchData();
        // 格式化数据
        formatData();
        // 写入文件
        writeFile();
        // 关闭资源
        closeResources();
        // 钩子方法，子类可以选择覆盖
        if (shouldNotify()) {
            // 发送通知
            notifyUser();
        }
    }

    /**
     * 查询数据(所有导出通用)
     */
    protected void fetchData() {
        System.out.println("查询数据...");
    }

    /**
     * 格式化数据(不同导出方式不同，由子类实现)
     */
    protected abstract void formatData();

    /**
     * 写入文件(提供默认实现，子类可覆盖)
     */
    protected void writeFile() {
        System.out.println("写入文件...");
    }

    /**
     * 关闭资源(所有导出通用)
     */
    protected void closeResources() {
        System.out.println("关闭数据源连接...");
    }

    /**
     * 发送通知(默认实现，子类可覆盖)
     */
    protected void notifyUser() {
        System.out.println("通知用户：导出完成！");
    }

    /**
     * 钩子方法，决定是否需要通知用户
     */
    protected boolean shouldNotify() {
        // 默认需要通知
        return true;
    }
}
